/*
文章评论 模块
其中 UncheckComment CheckComment 函数未使用
实现了二级评论的数据库表，但未实现对应的操作函数
*/

package model

import (
    "time"

    "gitee.com/keeving/quanta-test-cat/utils/errmsg"
    "github.com/gin-gonic/gin"
    "gorm.io/gorm"
)

// Comment 评论结构体
type Comment struct {
    gorm.Model
    ID            uint      `gorm:"primary_key;auto_increment" json:"firstCid"`
    UserId        uint      `json:"user_id"`
    ArticleId     uint      `json:"aid"`
    Content       string    `gorm:"type:varchar(500);not null;" json:"content"`
    Img           string    `gorm:"type:text" json:"img"`
    LikeNum       int       `gorm:"type:int;not null;default:0" json:"likeNum"`
    CommentNum    int       `gorm:"type:int;not null;default:0" json:"commentNum"` // 二级评论数量
    CreatedAt     time.Time `json:"createTime"`
    FirstHasLiked bool      `json:"firstHasLiked"`
    Status        int8      `gorm:"type:tinyint;default:1" json:"status"` // 评论审核状态 0:未通过 1:已通过
}

// 二级评论
// type SecondComments struct {
//     gorm.Model
//     ID             uint      `gorm:"primary_key;auto_increment" json:"secondCid"`
//     FirstCid       uint      `json:"firstCid"`
//     UserId         uint      `json:"user_id"`
//     ArticleId      uint      `json:"aid"`
//     Content        string    `gorm:"type:varchar(500);not null;" json:"content"`
//     Img            string    `gorm:"type:text" json:"img"`
//     LikeNum        int       `gorm:"type:int;not null;default:0" json:"likeNum"`
//     CommentNum     int       `gorm:"type:int;not null;default:0" json:"commentNum"` // 二级评论数量
//     CreatedAt      time.Time `json:"createTime"`
//     SecondHasLiked bool      `json:"secondHasLiked"`
//     Status         int8      `gorm:"type:tinyint;default:1" json:"status"` // 评论审核状态 0:未通过 1:已通过
// }

// AddComment 新增评论
func AddComment(data *Comment) int {
    err = db.Create(&data).Error
    // 更新评论的数量
    db.Model(&Article{}).Where("id = ?", data.ArticleId).Update("comment_count", gorm.Expr("comment_count + 1"))
    // fmt.Println("Error creating comment:", err2)
    if err != nil {
        // fmt.Println("插入失败:", err)
        return errmsg.ERROR
    }
    return errmsg.SUCCESS
}

// GetComment 查询单个评论
func GetComment(id int) (Comment, int) {
    var comment Comment
    err = db.Where("id = ?", id).First(&comment).Error
    if err != nil {
        return comment, errmsg.ERROR
    }
    return comment, errmsg.SUCCESS
}

// GetCommentList 后台所有获取评论列表
func GetCommentList(pageSize int, pageNum int) ([]Comment, int64, int) {

    var commentList []Comment
    var total int64
    db.Find(&commentList).Count(&total)
    err = db.Model(&commentList).Limit(pageSize).Offset((pageNum - 1) * pageSize).Order("Created_At DESC").Select("comment.id, article.title,user_id,article_id, user.username, comment.content, comment.status,comment.created_at,comment.deleted_at").Joins("LEFT JOIN article ON comment.article_id = article.id").Joins("LEFT JOIN user ON comment.user_id = user.id").Scan(&commentList).Error
    if err != nil {
        return commentList, 0, errmsg.ERROR
    }
    return commentList, total, errmsg.SUCCESS
}

// GetCommentCount 获取评论数量
func GetCommentCount(id int) int64 {
    var comment Comment
    var total int64
    db.Find(&comment).Where("article_id = ?", id).Where("status = ?", 1).Count(&total)
    return total
}

// GetCommentListFront 展示页面获取评论列表
func GetCommentListFront(id int, pageSize int, pageNum int) ([]gin.H, int64, int) {
    var commentList []Comment
    var total int64
    db.Find(&Comment{}).Where("article_id = ?", id).Where("status = ?", 1).Count(&total)
    err = db.Model(&Comment{}).Limit(pageSize).Offset((pageNum-1)*pageSize).Order("Created_At DESC").Select(
        "comment.id, article.title, comment.user_id, comment.article_id, user.username, comment.content, comment.status, comment.created_at, comment.deleted_at, comment.like_num",
    ).Joins("LEFT JOIN article ON comment.article_id = article.id").Joins("LEFT JOIN user ON comment.user_id = user.id").Where("comment.article_id = ?", id).Where("comment.status = ?", 1).Scan(&commentList).Error

    var result []gin.H
    for _, comment := range commentList {
        username, _ := GetUserName(comment.UserId)
        user, err := GetUserFromName(username)
        if err != errmsg.SUCCESS {
            // fmt.Println("Error getting user:", err)
            continue
        }

        // 使用 gin.H 将用户信息拼接到评论中
        result = append(result, gin.H{
            "user": gin.H{
                "id":       user.ID,
                "username": user.Username,
                "avatar":   user.Avatar,
            },
            "firstCid":       comment.ID,
            "content":        comment.Content,
            "img":            comment.Img,
            "likeNum":        comment.LikeNum,
            "commentNum":     0,
            "firstHasLiked":  comment.FirstHasLiked,
            "createTime":     comment.CreatedAt,
            "firstHasExpand": false,
            "secondList": []gin.H{
                {
                    "user": gin.H{
                        "id":       4,
                        "username": "jay",
                        "avatar":   "",
                    },
                    "firstCid":       comment.ID,
                    "secondCid":      3,
                    "content":        "测试223", // 修复这里
                    "img":            "",
                    "likeNum":        1,
                    "commentNum":     2,
                    "createTime":     "2024-03-20 17:18:36",
                    "secondHasLiked": true,
                    "replyUsername":  "jay",
                },
            }, // 第二级评论列表, 不变的
        })
    }
    if err != nil {
        // fmt.Println("查询失败:", err)
        return result, 0, errmsg.ERROR
    }
    return result, total, errmsg.SUCCESS
}

// DeleteComment 删除评论
func DeleteComment(id uint, userid uint) int {
    var comment Comment
    // 先查询评论
    if err := db.Where("id = ?", id).First(&comment).Error; err != nil {
        if err == gorm.ErrRecordNotFound {
            return errmsg.ERROR_COMMENT_NOT_EXIST
        }
        return errmsg.ERROR
    }

    // 比对传入的 userid 和查询到的 userid 是否一致
    if comment.UserId != userid {
        return errmsg.ERROR_PERMISSION_DENIED
    }


    // 执行删除操作
    if err := db.Delete(&comment).Error; err != nil {
        // 更新评论的数量
        db.Model(&Article{}).Where("id = ?", comment.ArticleId).Update("comment_count", gorm.Expr("comment_count + 1"))
        return errmsg.ERROR
    }

    return errmsg.SUCCESS
}

// CheckComment 通过评论
func CheckComment(id int, data *Comment) int {
    var comment Comment
    var res Comment
    var article Article
    var maps = make(map[string]interface{})
    maps["status"] = data.Status

    err = db.Model(&comment).Where("id = ?", id).Updates(maps).First(&res).Error
    db.Model(&article).Where("id = ?", res.ArticleId).UpdateColumn("comment_count", gorm.Expr("comment_count + ?", 1))
    if err != nil {
        return errmsg.ERROR
    }
    return errmsg.SUCCESS
}

// UncheckComment 撤下评论
func UncheckComment(id int, data *Comment) int {
    var comment Comment
    var res Comment
    var article Article
    var maps = make(map[string]interface{})
    maps["status"] = data.Status

    err = db.Model(&comment).Where("id = ?", id).Updates(maps).First(&res).Error
    db.Model(&article).Where("id = ?", res.ArticleId).UpdateColumn("comment_count", gorm.Expr("comment_count - ?", 1))
    if err != nil {
        return errmsg.ERROR
    }
    return errmsg.SUCCESS
}
